package com.sugon.modules.workflow;

import com.cait.bpmsuite.api.bpmmodle.BPMProcessInstance;
import com.cait.bpmsuite.api.bpmmodle.BPMResult;
import com.cait.bpmsuite.api.bpmmodle.BPMWorkItem;

/**
 * 长安OA工作列Manager
 *
 * @author YuXD
 * @since 2021-12-06
 */
public interface IWorkFlowManager {

    /**
     * 流程回退
     *
     * @param actInstId 活动环节实例id
     * @param msg       回退消息
     * @return
     */
    BPMResult gobackActivityInstance(String actInstId, String msg);

    /**
     * 根据工作项ID获取具体的工作流中工作项
     *
     * @param workItemId 工作项ID
     * @return
     */
    BPMWorkItem getWorkItemById(String workItemId);

    /**
     * 获取BPM服务地址
     *
     * @return
     */
    String getBpmServiceUrl();

    /**
     * 完成工作项
     * 逻辑：先尝试获取工作项然后判断状态是否是激活中
     * 如果是则完成，否则则返回false
     *
     * @param workItemId 工作项ID
     * @return
     */
    boolean completeWorkItem(String workItemId);

    /**
     * 取消领料审核流程
     *
     * @param materialBaseId 领料单ID
     * @param procInstId     领料审核流程实例ID
     * @return
     */
    boolean terminateProcessInstance(String materialBaseId, String procInstId);

    /**
     * 发起流程
     *
     * @param procInstId 流程实例ID
     * @return
     */
    BPMResult startProcessInstance(String procInstId);

    /**
     * 设置流程实例全局变量
     *
     * @param procInstId 流程实例ID
     * @param key        键
     * @param value      值
     */
    void setProcessInstanceRelatedData(String procInstId, String key, Object value);

    /**
     * 创建流程实例
     *
     * @param procDefId          流程定义ID
     * @param procInstTitle      流程实例标题
     * @param startProcessUserId 流程发起人 长安用户ID
     * @return
     */
    BPMProcessInstance createProcessInstance(String procDefId, String procInstTitle, String startProcessUserId);

    /**
     * 查看流程实例信息
     *
     * @param procInstId 流程实例ID
     * @return
     */
    BPMProcessInstance getByProcInstId(String procInstId);

    /**
     * 完成我的指定流程中正在进行的工作项 并记录结果
     *
     * @param procInstId 流程实例ID
     * @param unionId    长安用户ID
     * @param busType    业务类型
     * @param busId      业务ID
     * @param remark     备注
     */
    void completeMyWorkItem(String procInstId, String unionId, String busType, String busId, String remark);

    /**
     * 终止审核流程
     *
     * @param procInstId 流程实例ID
     * @return
     */
    boolean terminateProcessInstance(String procInstId);

    /**
     * 开始并完成第一个工作项
     *
     * @param materialBaseId     领料单ID
     * @param startProcessUserId 创建流程用户ID
     * @param title              流程实力TITLE
     * @param approver           审批人 长安认证中心的用户ID
     * @return
     */
    void startAndCompleteFirstWorkItem(String materialBaseId, String startProcessUserId, String title, String approver);

}
